package com.ma.array.binary;

/**
 * @ClassName Solution875
 * @Author: mayongqiang
 * @DATE 2022/3/23 12:56
 * @Description: 吃香蕉最慢速度
 */
public class Solution875 {
    /*
    珂珂喜欢吃香蕉。这里有N堆香蕉，第 i 堆中有piles[i]根香蕉。警卫已经离开了，将在H小时后回来。
        珂珂可以决定她吃香蕉的速度K（单位：根/小时）。每个小时，她将会选择一堆香蕉，从中吃掉 K 根。
        如果这堆香蕉少于 K 根，她将吃掉这堆的所有香蕉，然后这一小时内不会再吃更多的香蕉。
        珂珂喜欢慢慢吃，但仍然想在警卫回来前吃掉所有的香蕉。
        返回她可以在 H 小时内吃掉所有香蕉的最小速度 K（K 为整数）。
     */
    public static void main(String[] args) {
        //输入: piles = [3,6,7,11], H = 8
        //输出: 4
        int[] piles = {3,6,7,11};
        int H = 8;
        System.out.println(minEatingSpeed(piles, H));
        //输入: piles = [30,11,23,4,20], H = 5
        //输出: 30
        int[] piles1 = {30,11,23,4,20};
        int H1 = 5;
        System.out.println(minEatingSpeed(piles1, H1));
    }
    // 规定了时间，要求速度的最值 --->  设计函数使其 自变量为速度  因变量为时间
    public static int minEatingSpeed(int[] piles, int h) {

        int left = 1,right = 1000000000;
        while(left<=right){
            int mid = left + (right-left)/2;
            // 速度mid吃完花费时间小于h  应该 降低速度
            if(fun(piles,mid)<=h){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }
        return left;
    }
    //以x的速度完piles需要花费的小时  x越大，花费时间 越小
    public static int fun(int[] piles, int x){
        int hours = 0;
        for(int i = 0;i<piles.length;i++){
            hours+=piles[i]/x;
            if(piles[i]%x>0){
                hours++;
            }
        }
        return hours;
    }
}
